package dbTools.db.writer.writers;

import java.util.Map;

import projectsupporter.common.control.Path;
import dbTools.db.writer.ISQLWriter;
import dbTools.pojo.structure.property.BeanProperty;
import dbTools.tableInfo.field.Field;
import dbTools.tableInfo.info.TableInfo;
import dbTools.util.FileUtil;

public abstract class AbstractSQLWriter implements ISQLWriter {

	/**
	 * 根据单个表的定义生成单个DB脚本文件。
	 * @param tableInfo 表定义信息
	 * @param mainPath 路径信息
	 * @return true：成功  false：失败
	 */
	@Override
	public boolean createSingleTableScript(TableInfo tableInfo, Path mainPath) {
		
		String path = mainPath.getAbsolutePath();
		
		FileUtil file= new FileUtil(path,tableInfo.getTableId()+".sql");
		
		file.write(getTableCreateSQL(tableInfo));
		
		return true;
	}

	/**
	 * 
	 * @param tableInfos 表定义信息字典
	 * @param mainPath 路径信息
	 * @param isFileByTable 是否一个表生成一个文件
	 * @return true：成功  false：失败
	 */
	@Override
	public boolean createTablesScript(Map<String, TableInfo> tableInfos,
			Path mainPath, boolean isFileByTable) {
		
		String path = mainPath.getAbsolutePath();
		
		FileUtil file= new FileUtil(path,"DB.sql");
		
		file.write(getDBCreateSQL(tableInfos));
		
		return true;
	}
	
	/**
	 * 获取DB的create语句
	 * @param tableInfos 表定义信息字典
	 * @return 表的create语句
	 */
	public String getDBCreateSQL(Map<String,TableInfo> tableInfos){
		
		StringBuilder sql = new StringBuilder();
		
		for(Map.Entry<String,TableInfo> tableEntry : tableInfos.entrySet())
		 {
			TableInfo table = tableEntry.getValue();
			 sql.append(this.getTableCreateSQL(table)+ "\r\n");
		 } 
		
		return sql.toString();
	}
	
	/**
	 * 获取表的create语句
	 * @param tableInfo 表定义信息
	 * @return 表的create语句
	 */
	@Override
	public String getTableCreateSQL(TableInfo tableInfo){
		
		StringBuilder sql = new StringBuilder();
		
		//头部
		sql.append( this.getCreateHeaderInfo(tableInfo) + "\r\n");
		sql.append("(" + "\r\n");
		
		//field信息
		int count =0;
		for(Map.Entry<String,Field> fieldEntry : tableInfo.getAllFields().entrySet())
		 {
			count ++;
			 Field field=fieldEntry.getValue();
			 if(count == tableInfo.getAllFields().size() ){
				 sql.append("    " + this.getFieldInfo(field));
			 }else{
				 sql.append("    " + this.getFieldInfo(field)+ ",\r\n"); 
			 }
			 
		 } 
		
		//key信息
		String keyInfo = this.getKeyInfo(tableInfo);
		if(keyInfo.trim().length() > 0){
			sql.append(",\r\n" + this.getKeyInfo(tableInfo) + "\r\n");
		}
		
		//尾部
		sql.append(");" + "\r\n");
		
		sql.append( this.getCreateFooterInfo(tableInfo) + "\r\n");
		
		return sql.toString();
	}
	
	/**
	 * 获取建表语句头部
	 * @param tableInfo 表定义信息
	 * @return 建表语句头部
	 */
	abstract public String getCreateHeaderInfo(TableInfo tableInfo);
	
	/**
	 * 获取字段的建表信息
	 * @param field 字段信息
	 * @return 字段的建表信息
	 */
	abstract public String getFieldInfo(Field field);

	/**
	 * 获取主键信息
	 * @param tableInfo 表定义信息
	 * @return 主键信息
	 */
	abstract public String getKeyInfo(TableInfo tableInfo);
	
	/**
	 * 获取建表语句尾部
	 * @param tableInfo 表定义信息
	 * @return 建表语句尾部
	 */
	abstract public String getCreateFooterInfo(TableInfo tableInfo);
}
